package com.zomiot.portal.user.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.stp.StpUtil;
import com.zomiot.portal.common.result.Result;
import com.zomiot.portal.user.dto.UserInfoVO;
import com.zomiot.portal.user.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 用户信息相关接口
 *
 * @author Joash_Yi
 */
@Slf4j
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 获取当前登录用户信息
     * 需要登录才能访问
     *
     * @return 用户信息
     */
    @SaCheckLogin
    @GetMapping("/info")
    public Result<UserInfoVO> getUserInfo() {
        log.info("【获取用户信息】userId={}", StpUtil.getLoginId());
        UserInfoVO userInfo = userService.getCurrentUser();
        return Result.success(userInfo);
    }

    /**
     * 根据ID查询用户信息（管理员功能）
     * 需要ADMIN角色
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    @SaCheckRole("SYSTEM_ADMIN")
    @GetMapping("/{userId}")
    public Result<UserInfoVO> getUserById(@PathVariable Long userId) {
        log.info("【管理员查询用户】targetUserId={}", userId);
        UserInfoVO userInfo = userService.getUserById(userId);
        return Result.success(userInfo);
    }

    /**
     * 测试会员权限
     * 需要MEMBER权限
     *
     * @return 测试结果
     */
    @SaCheckPermission("MEMBER")
    @GetMapping("/member-test")
    public Result<String> memberTest() {
        return Result.success("恭喜！您拥有会员权限");
    }

    /**
     * 测试编辑权限
     * 需要EDITOR权限
     *
     * @return 测试结果
     */
    @SaCheckPermission("EDITOR")
    @GetMapping("/editor-test")
    public Result<String> editorTest() {
        return Result.success("恭喜！您拥有编辑权限");
    }

    /**
     * 测试管理员权限
     * 需要ADMIN权限
     *
     * @return 测试结果
     */
    @SaCheckPermission("ADMIN")
    @GetMapping("/admin-test")
    public Result<String> adminTest() {
        return Result.success("恭喜！您拥有管理员权限");
    }
}